{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "7332a2d0-10c9-40f2-8bda-9a2ec630f13f",
   "metadata": {},
   "source": [
    "Chapter 21\n",
    "# 无向图的拉普拉斯矩阵\n",
    "Book_6《数据有道》 | 鸢尾花书：从加减乘除到机器学习"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "ac43e145-b958-4c37-be88-32516fe9bdf0",
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import networkx as nx\n",
    "import numpy as np\n",
    "import seaborn as sns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "8aa6b49e-bbb9-48e1-94ca-6034b04f6fe3",
   "metadata": {},
   "outputs": [],
   "source": [
    "G = nx.Graph()\n",
    "# 创建无向图的实例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "6d040088-8f36-4e83-9203-4536c4d8188a",
   "metadata": {},
   "outputs": [],
   "source": [
    "G.add_nodes_from(['a', 'b', 'c', 'd'])\n",
    "# 添加多个顶点"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "f37a2cdf-1e76-4a46-bf35-5492af13e615",
   "metadata": {},
   "outputs": [],
   "source": [
    "G.add_edges_from([('a','b'),('b','c'),\n",
    "                  ('b','d'),('c','d'),\n",
    "                  ('c','a')])\n",
    "# 增加一组边"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "135de57a-48aa-4d48-9131-62deabb7f6d5",
   "metadata": {},
   "source": [
    "## 拉普拉斯矩阵"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "c4c3e7a1-7799-4c4d-b984-7cedc4cafdd3",
   "metadata": {},
   "outputs": [],
   "source": [
    "L = nx.laplacian_matrix(G).toarray()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "3b214a5c-4331-48c5-b82b-28c3cb529d42",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 2, -1, -1,  0],\n",
       "       [-1,  3, -1, -1],\n",
       "       [-1, -1,  3, -1],\n",
       "       [ 0, -1, -1,  2]], dtype=int32)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "L"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "6382a2cc-1425-43ba-a4fc-c1666ab9bc90",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfMAAAGiCAYAAADz3S8ZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAvF0lEQVR4nO3de1yUdd7/8ffgYSAVPCAHsxIPqyae8ggdxLS8Sy2sn2tuLdZtupaaipXS7aGsdnYzzQ6WqbV2WG/NdtWyMg1THyVrnmg9Z5pLGaClYJCMCPz+4Jaa5ELAYS6+w+u5j+vx2Lm6rms+XI6++Xyua2YcRUVFRQIAAMYKsLsAAABwaQhzAAAMR5gDAGA4whwAAMMR5gAAGI4wBwDAcIQ5AACGI8wBADAcYQ4AgOEIcwAADEeYAwBg4ZVXXlGnTp0UHBys4OBgxcTE6KOPPipznxUrVqhdu3YKDAxUx44d9eGHH1Z5nYQ5AAAWmjdvrr/85S/asWOHtm/frhtvvFG333679u7dW+r2W7Zs0fDhwzVy5Ejt2rVL8fHxio+P1549e6q0TgdftAIAQPk1btxYs2fP1siRIy/4b8OGDVNubq7WrFlTsq53797q0qWLFixYUGU10ZkDAGoct9ut06dPeyxut7vMfQoKCrRs2TLl5uYqJiam1G1SUlLUv39/j3UDBgxQSkqK12ovTe0qPXoFOBwOu0sAAFSSL4a8QV3Hee1YU24P1RNPPOGxbubMmXr88ccv2Hb37t2KiYlRXl6e6tevr5UrV+rqq68u9bgZGRkKDw/3WBceHq6MjAyv1V6aahPmktRi4pqLb4RLdnTeIEnSmXyusPhKUJ3iX1Y5575x/nxvOXTK5kpqhtg2jXzzRA7vDZOTkpKUmJjosc7pdJa6bdu2bZWamqrs7Gy9++67GjFihDZt2mQZ6HaoVmEOAIAvOJ1Oy/D+rbp166p169aSpG7dumnbtm16/vnn9eqrr16wbUREhDIzMz3WZWZmKiIi4tKLLgPXzAEAZnA4vLdcgsLCQsvr6zExMUpOTvZYt379estr7N5CZw4AMIMXx+zllZSUpFtuuUVXXnmlfvrpJy1dulQbN27Uxx9/LElKSEjQ5ZdfLpfLJUmaMGGC+vTpozlz5mjgwIFatmyZtm/froULF1ZpnYQ5AMAMNtwoffz4cSUkJCg9PV0hISHq1KmTPv74Y910002SpLS0NAUE/PJLRmxsrJYuXapp06bpscceU5s2bbRq1SpFR0dXaZ2EOQAAFl577bUy//vGjRsvWDd06FANHTq0iioqHWEOADCDDWN2UxDmAAAz8Hkklvg1BwAAw9GZAwDMwJjdEmEOADADY3ZL/JoDAIDh6MwBAGZgzG6JMAcAmIExuyV+zQEAwHB05gAAMzBmt0SYAwDMwJjdEmEOADADnbklzgwAAIajMwcAmIHO3BJhDgAwQwDXzK3waw4AAIajMwcAmIExuyXCHABgBt6aZolfcwAAMBydOQDADIzZLRHmAAAzMGa3xK85AAAYjs4cAGAGxuyWCHMAgBkYs1sizAEAZqAzt8SZAQDAcHTmAAAzMGa3RJgDAMzAmN0SZwYAAMPRmQMAzMCY3RJhDgAwA2N2S5wZAAAMR2cOADADnbklwhwAYAaumVsizCvhgX6tNKBThFqF1VdefoF2Hj2lv75/QEdO5Npdml/7ZP06rXhnmfbv3avs7Cwtf3eV2rVvb3dZfovz7XufrFmhj/7xd2Wf+lFXRrXRPWMmq2XbDnaXBQMws6iEXq0a663P/qM7nv9cCQu2qnatAL05pqeC6tayuzS/dubMz+ra9RpNTHzY7lJqBM63b23dvF7LFj2v+D+M1BMvvKErolrr2ekTdDrrpN2lVR+OAO8t5eRyudSjRw81aNBAYWFhio+P18GDB8vcZ8mSJXI4HB5LYGDgpf70ZaIzr4R7F27zePzI0i+146mb1LF5iL44wl+8qjL4tnhJ0rFj39lbSA3B+fatj1f+r/r81+26/qbBkqQR46bqy+1btHnd+xr0+xE2V1dN2DBm37Rpk8aOHasePXro3Llzeuyxx3TzzTdr3759qlevnuV+wcHBHqHvqOLaLynM9+3bp7S0NJ09e9Zj/W233XZJRZmmQVDxacz6+exFtgSAC53Lz9fRrw9o4K9COyAgQB269NDhA7ttrKyaseEGuLVr13o8XrJkicLCwrRjxw7dcMMNlvs5HA5FRERUdXklKhXmR44c0ZAhQ7R79245HA4VFRVJ+uU3j4KCgjL3d7vdcrvdlXnqasfhkKbHX61tR07qq4wcu8sBYKCfTmepsLBAIQ0be6wPbthY6d/+x6aq/FtpOeR0OuV0OsvcLzs7W5LUuHHjMrfLycnRVVddpcLCQl1zzTX685//rA4dqu7+h0r9mjNhwgRFRUXp+PHjuuyyy7R3715t3rxZ3bt318aNGy+6v8vlUkhIiMdiqll3RqttZAM99OYuu0vxKx+seU+9u3ctWXbu2G53SX6N8w0jOBxeW0rLIZfLVebTFxYWauLEibr22msVHR1tuV3btm31+uuva/Xq1Xr77bdVWFio2NhYffdd1V2yqlRnnpKSog0bNig0NFQBAQEKCAjQddddJ5fLpYceeki7dpUdbElJSUpMTPRYZ2KgP3FHB914dZiGvZSijOw8u8vxK3F9b1THjp1LHoeFh9tYjf/jfNurQXBDBQTUUvZvbnY7nXVSIY3K7gBrEm9edy4thy7WlY8dO1Z79uzRZ599VuZ2MTExiomJKXkcGxur9u3b69VXX9WTTz5Z+aLLUKkwLygoUIMGDSRJoaGh+v7779W2bVtdddVVF73LTyrfKKO6e+KODrq5Y4SGz0/RdyfP2F2O36lXr77q1atvdxk1BufbXrXr1FGL1u20L3WbusX0kVTcBe5L3aZ+g4baXJ1/qmgOjRs3TmvWrNHmzZvVvHnzCj1XnTp11LVrV3399dcVLbPcKhXm0dHR+vLLLxUVFaVevXrpmWeeUd26dbVw4UK1bNnS2zVWO7PujNbt3Zpp9GvbleMuUGiD4hfET3n5cucX2lyd/8rOylJ6erpOnDguSTp69BtJxb9QhjZtamdpfonz7VsDhgzXormzFNWmvVr+7mqtW71M7rw8XX/TILtLqzaq+o7w0hQVFWn8+PFauXKlNm7cqKioqAofo6CgQLt379att95aBRUWq1SYT5s2Tbm5xR+QMmvWLA0aNEjXX3+9mjRpouXLl3u1wOroj9ddJUlaNi7GY/3DS7/UP7bxNp6qsvHTDZoxLank8ZSHJ0mSxjw4Tg+MHW9XWX6L8+1bvW64ST9lZ2nl2wuLPzSm5e80edY8hTRqYndp1YcNHwA3duxYLV26VKtXr1aDBg2UkZEhqfjScFBQkCQpISFBl19+eck191mzZql3795q3bq1srKyNHv2bP3nP//R/fffX2V1OorO34p+iU6ePKlGjRpV+jcnh8OhFhPXeKMUXMTRecW/6Z/J98ofPcohqE7x3wvOuW+cP99bDp2yuZKaIbZNI3kpSspUb+jfvHas3BX3lWs7q0z729/+pnvvvVeSFBcXpxYtWmjJkiWSpEmTJumf//ynMjIy1KhRI3Xr1k1PPfWUunbt6o3SS+W1D4252G36AABcCrvG7Bfz23dxPffcc3ruueeqqKLS8QlwAAAj2BHmpuCz2QEAMBydOQDACHTm1ghzAIARCHNrhDkAwAxkuSWumQMAYDg6cwCAERizWyPMAQBGIMytMWYHAMBwdOYAACPQmVsjzAEARiDMrTFmBwDAcHTmAAAz0JhbIswBAEZgzG6NMTsAAIajMwcAGIHO3BphDgAwAmFujTAHAJiBLLfENXMAAAxHZw4AMAJjdmuEOQDACIS5NcbsAAAYjs4cAGAEOnNrhDkAwAiEuTXG7AAAGI7OHABgBhpzS4Q5AMAIjNmtMWYHAMBwdOYAACPQmVsjzAEARiDMrRHmAAAzkOWWuGYOAIDh6MwBAEZgzG6NMAcAGIEwt8aYHQAAwxHmAAAjOBwOry3l5XK51KNHDzVo0EBhYWGKj4/XwYMHL7rfihUr1K5dOwUGBqpjx4768MMPL+VHvyjCHABgBDvCfNOmTRo7dqz+9a9/af369crPz9fNN9+s3Nxcy322bNmi4cOHa+TIkdq1a5fi4+MVHx+vPXv2eOM0lMpRVFRUVGVHrwCHw6EWE9fYXUaNcHTeIEnSmfxq8UdfIwTVKf7Hg3PuG+fP95ZDp2yupGaIbdNIvoiSqIkfeO1Y38wbWKn9Tpw4obCwMG3atEk33HBDqdsMGzZMubm5WrPml0zr3bu3unTpogULFlTqeS+mWt0Adz5k4Bvn/8GD73DOfSu2TSO7S4A3efGvj9vtltvt9ljndDrldDrL3C87O1uS1LhxY8ttUlJSlJiY6LFuwIABWrVqVeWKLQfG7AAAI3hzzO5yuRQSEuKxuFyuMp+/sLBQEydO1LXXXqvo6GjL7TIyMhQeHu6xLjw8XBkZGV45D6WpVp05I0jfON8dBnYZa3MlNUde6nxJvMZ9hcsavmXixCkpKemC7vliXfnYsWO1Z88effbZZ1VZWqVUqzAHAMCKN99nXp6R+q+NGzdOa9as0ebNm9W8efMyt42IiFBmZqbHuszMTEVERFSq1vJgzA4AMILD4b2lvIqKijRu3DitXLlSGzZsUFRU1EX3iYmJUXJysse69evXKyYmpqI/crnRmQMAjGDHJ8CNHTtWS5cu1erVq9WgQYOS694hISEKCgqSJCUkJOjyyy8vueY+YcIE9enTR3PmzNHAgQO1bNkybd++XQsXLqyyOunMAQCw8Morryg7O1txcXGKjIwsWZYvX16yTVpamtLT00sex8bGaunSpVq4cKE6d+6sd999V6tWrSrzprlLRWcOADCCHR/NXp73z2/cuPGCdUOHDtXQoUOroKLSEeYAACPwRSvWGLMDAGA4OnMAgBFozK0R5gAAIwQEkOZWGLMDAGA4OnMAgBEYs1sjzAEARuBudmuM2QEAMBydOQDACDTm1ghzAIARGLNbI8wBAEYgzK1xzRwAAMPRmQMAjEBjbo0wBwAYgTG7NcbsAAAYjs4cAGAEGnNrhDkAwAiM2a0xZgcAwHB05gAAI9CYWyPMAQBGYMxujTE7AACGozMHABiBxtwaYQ4AMAJjdmuEOQDACGS5Na6ZAwBgODpzAIARGLNbI8wBAEYgy60xZgcAwHB05gAAIzBmt0aYAwCMQJZbY8wOAIDh6MwBAEZgzG6NMAcAGIEwt8aYHQAAw9GZX4JP1q/TineWaf/evcrOztLyd1epXfv2dpfld0YNvU6j/t/1uqpZY0nS/iMZ+vPCj7Tu8302V+bfeH37Hue8bDTm1ujML8GZMz+ra9drNDHxYbtL8WvHMrM0/cXVir37GV1792xt/OIrrXhutNq3jLC7NL/G69v3OOdlczgcXlv8DZ35JRh8W7wk6dix7+wtxM99uHmPx+PH57+vUUOvU89OUdp/JMOmqvwfr2/f45yXza4M3rx5s2bPnq0dO3YoPT1dK1euVHx8vOX2GzduVN++fS9Yn56eroiIqmlC6MxhlIAAh4YO6KZ6QXW19d/f2F0OgBogNzdXnTt31vz58yu038GDB5Wenl6yhIWFVVGFXujMi4qKJFXsLkO32y23232pT40apEPrZtr4xmQF1q2tnDNuDZu8SAfoyoEaxZvj8dJyyOl0yul0XrDtLbfcoltuuaXCzxEWFqaGDRtWtsQKqXRn/tprryk6OlqBgYEKDAxUdHS0Fi9eXK59XS6XQkJCPJbq7oM176l3964ly84d2+0uqUb56mimet3l0g0Jz2rRis+0aNYf1Y5r5l7D69v3OOcV53B4bykth1wul1fr7dKliyIjI3XTTTfp888/9+qxf6tSnfmMGTM0d+5cjR8/XjExMZKklJQUTZo0SWlpaZo1a1aZ+yclJSkxMdFjXXUP9Li+N6pjx84lj8PCw22spubJP1egI9/+IEnatf9bdetwpcYOj9P4p5fZXJl/4PXte5xze5WWQ6V15ZURGRmpBQsWqHv37nK73Vq8eLHi4uK0detWXXPNNV55jt+qVJi/8sorWrRokYYPH16y7rbbblOnTp00fvz4i4a51SijOqtXr77q1atvdxn4PwEOh5x1uX/TW3h9+x7nvOICvDhmr8ocatu2rdq2bVvyODY2VocPH9Zzzz2nt956q0qes1L/Gubn56t79+4XrO/WrZvOnTt3yUWZIjsrS+np6Tpx4rgk6ejR4huyQkNDFdq0qZ2l+ZVZ42/Tx5/v1bfpp9SgXqCG3dJdN3Rvo8EPvmx3aX6N17fvcc7LZvI7ynr27KnPPvusyo5fqTD/4x//qFdeeUVz5871WL9w4ULdfffdXinMBBs/3aAZ05JKHk95eJIkacyD4/TA2PF2leV3mjaur9eeTFBEaLCyc/K059AxDX7wZW3YesDu0vwar2/f45z7r9TUVEVGRlbZ8csd5r++tuBwOLR48WKtW7dOvXv3liRt3bpVaWlpSkhI8H6V1dTtQ+7Q7UPusLsMv/fAE0vtLqFG4vXte5zzstn1YS85OTn6+uuvSx5/8803Sk1NVePGjXXllVcqKSlJx44d05tvvilJmjdvnqKiotShQwfl5eVp8eLF2rBhg9atW1dlNZY7zHft2uXxuFu3bpKkw4cPS/q/MVBoqPbu3evF8gAAKBZg05h9+/btHh8Cc765HTFihJYsWaL09HSlpaWV/PezZ89q8uTJOnbsmC677DJ16tRJn3zySakfJOMtjqLzbxS3mcPh0Jn8alGK3wuqU/w3IrDLWJsrqTnyUos/bILXuG+cf41zvn0jqI5DvoiSWxd84bVjfTimp9eOVR3wCXAAABiO9/YAAIxg8t3sVY0wBwAYwSHS3ApjdgAADEdnDgAwgl13s5uAMAcAGMGu95mbgDE7AACGozMHABiBxtwaYQ4AMII3vzXN3zBmBwDAcHTmAAAj0JhbI8wBAEbgbnZrhDkAwAhkuTWumQMAYDg6cwCAEbib3RphDgAwAlFujTE7AACGozMHABiBu9mtEeYAACPwrWnWGLMDAGA4OnMAgBEYs1sjzAEARiDLrTFmBwDAcHTmAAAjMGa3RpgDAIzA3ezWCHMAgBHozK1xzRwAAMPRmQMAjEBfbo0wBwAYgW9Ns8aYHQAAw9GZAwCMQGNujTAHABiBu9mtMWYHAMBwdOYAACPQmFsjzAEARuBudmuM2QEAKMPmzZs1ePBgNWvWTA6HQ6tWrbroPhs3btQ111wjp9Op1q1ba8mSJVVaI2EOADCCw+G9pSJyc3PVuXNnzZ8/v1zbf/PNNxo4cKD69u2r1NRUTZw4Uffff78+/vjjSvzU5eMoKioqqrKjVwB3KQKAuXwRJWNX7vfasebe2lJut9tjndPplNPpLHM/h8OhlStXKj4+3nKbKVOm6IMPPtCePXtK1t11113KysrS2rVrL6luK3TmAAAjBHhxcblcCgkJ8VhcLpdX6kxJSVH//v091g0YMEApKSleOX5pqtUNcGfyq8WQwO8F1SmegnC+fef8OQ/sMtbmSmqGvNTicSivcd84//o2SVJSkhITEz3WXawrL6+MjAyFh4d7rAsPD9fp06d15swZBQUFeeV5fq1ahTkAAFa8eTm2PCN1kxDmAAAjBBgyAIiIiFBmZqbHuszMTAUHB1dJVy5xzRwAAK+KiYlRcnKyx7r169crJiamyp6TMAcAGCHA4b2lInJycpSamqrU1FRJxW89S01NVVpamqTi6+8JCQkl248ZM0ZHjhzRo48+qgMHDujll1/WO++8o0mTJnnrVFyAMTsAwAh2vYV5+/bt6tu3b8nj8zfOjRgxQkuWLFF6enpJsEtSVFSUPvjgA02aNEnPP/+8mjdvrsWLF2vAgAFVViNhDgBAGeLi4sp8H31pn+4WFxenXbt2VWFVnghzAIARTLkBzg6EOQDACHxQqDVugAMAwHB05gAAI/AVqNYIcwCAERglWyPMAQBGoDG3xi86AAAYjs4cAGAErplbI8wBAEYgy60xZgcAwHB05gAAI/AJcNYIcwCAEbhmbo0xOwAAhqMzBwAYgcbcGmEOADAC18ytMWYHAMBwdOYAACM4RGtuhTAHABiBMbs1whwAYATC3BrXzAEAMBydOQDACA7em2aJMAcAGIExuzXG7AAAGI7OHABgBKbs1ghzAIAR+KIVa4zZAQAwHJ05AMAI3ABnjTAHABiBKbs1xuwAABiOzhwAYIQAvmjFEmEOADACY3ZrhDkAwAjcAGeNa+YAABiOzvwSfLJ+nVa8s0z79+5VdnaWlr+7Su3at7e7LL/F+faNUUOv06j/d72uatZYkrT/SIb+vPAjrft8n82V+T9e42XjQ2Os0ZlfgjNnflbXrtdoYuLDdpdSI3C+feNYZpamv7hasXc/o2vvnq2NX3ylFc+NVvuWEXaX5vd4jZfN4fDe4m/ozC/B4NviJUnHjn1nbyE1BOfbNz7cvMfj8ePz39eoodepZ6co7T+SYVNVNQOv8epr/vz5mj17tjIyMtS5c2e9+OKL6tmzZ6nbLlmyRPfdd5/HOqfTqby8vCqrjzAHYCkgwKE7b7pG9YLqauu/v7G7HNRwdo3Zly9frsTERC1YsEC9evXSvHnzNGDAAB08eFBhYWGl7hMcHKyDBw+WPK7q72KvVJi7XC6Fh4frv//7vz3Wv/766zpx4oSmTJnileIA2KND62ba+MZkBdatrZwzbg2bvEgH6MphM7vG43PnztWoUaNKuu0FCxbogw8+0Ouvv66pU6eWuo/D4VBEhO8uTVXqmvmrr76qdu3aXbC+Q4cOWrBgwUX3d7vdOn36tMdS3X2w5j317t61ZNm5Y7vdJfk1zre9vjqaqV53uXRDwrNatOIzLZr1R7XjmrlX8Rq3V2k55Ha7L9ju7Nmz2rFjh/r371+yLiAgQP3791dKSorl8XNycnTVVVfpiiuu0O233669e/dWyc9xXqU684yMDEVGRl6wvmnTpkpPT7/o/i6XS0888URlnto2cX1vVMeOnUseh4WH21iN/+N82yv/XIGOfPuDJGnX/m/VrcOVGjs8TuOfXmZzZf6D13jFefOO7dJyaObMmXr88cc91v3www8qKChQ+G/+fMLDw3XgwIFSj922bVu9/vrr6tSpk7Kzs/Xss88qNjZWe/fuVfPmzb34U/yiUmF+xRVX6PPPP1dUVJTH+s8//1zNmjW76P5JSUlKTEz0WBcSElKZUnymXr36qlevvt1l1Bic7+olwOGQsy632HgTr/GK8+Z159JyyOl0euXYMTExiomJKXkcGxur9u3b69VXX9WTTz7plef4rUr97Rw1apQmTpyo/Px83XjjjZKk5ORkPfroo5o8efJF93c6nV47aXbKzspSenq6Tpw4Lkk6erT4BqHQ0FCFNm1qZ2l+ifPtG7PG36aPP9+rb9NPqUG9QA27pbtu6N5Ggx982e7S/B6vcd8pbw6FhoaqVq1ayszM9FifmZlZ7mviderUUdeuXfX1119XqtbyqFSYP/LII/rxxx/14IMP6uzZs5KkwMBATZkyRUlJSV4tsDrb+OkGzZj2y8875eFJkqQxD47TA2PH21WW3+J8+0bTxvX12pMJiggNVnZOnvYcOqbBD76sDVtLHynCe3iNl82O+9/q1q2rbt26KTk5WfHx8ZKkwsJCJScna9y4ceU6RkFBgXbv3q1bb721yup0FBUVFVV255ycHO3fv19BQUFq06bNJXXbDodDZ/IrXQoqIKhO8V8JzrfvnD/ngV3G2lxJzZCXOl8Sr3FfCarj0CVESbm9vcN777+/p1v5r10vX75cI0aM0KuvvqqePXtq3rx5euedd3TgwAGFh4crISFBl19+uVwulyRp1qxZ6t27t1q3bq2srCzNnj1bq1at0o4dO3T11Vd77Wf4tUu6CFa/fn316NHDW7UAAGDJrg9uGzZsmE6cOKEZM2YoIyNDXbp00dq1a0tuiktLS1NAwC+35506dUqjRo1SRkaGGjVqpG7dumnLli1VFuTSJXbm3kRn7jt05r5HZ+5bdOa+5avO/O9e7MzvrkBnbgJuTwUAGMEfP1PdWwhzAIARqvojUU3Gt6YBAGA4OnMAgBHoPq0R5gAAIzBmt8YvOgAAGI7OHABgBPpya4Q5AMAIjNmtMWYHAMBwdOYAACPQfVojzAEARmDMbo0wBwAYgSi3xtQCAADD0ZkDAIzAlN0aYQ4AMEIAg3ZLjNkBADAcnTkAwAiM2a0R5gAAIzgYs1tizA4AgOHozAEARmDMbo0wBwAYgbvZrTFmBwDAcHTmAAAjMGa3RpgDAIxAmFsjzAEARuCtada4Zg4AgOHozAEARgigMbdEmAMAjMCY3RpjdgAADEdnDgAwAnezWyPMAQBGYMxujTE7AACGozMHABiBu9mtEeYAACMwZrfGmB0AAMMR5gAAIzgc3lsqav78+WrRooUCAwPVq1cvffHFF2Vuv2LFCrVr106BgYHq2LGjPvzww0r+1OVDmAMAjODw4lIRy5cvV2JiombOnKmdO3eqc+fOGjBggI4fP17q9lu2bNHw4cM1cuRI7dq1S/Hx8YqPj9eePXsq+iOXm6OoqKioyo5eAQ6HQ2fyq0Upfi+oTvFLmfPtO+fPeWCXsTZXUjPkpc6XxGvcV4LqOOSLKEn5Ostrx4pp3bDc2/bq1Us9evTQSy+9JEkqLCzUFVdcofHjx2vq1KkXbD9s2DDl5uZqzZo1Jet69+6tLl26aMGCBZdce2mq1Q1w5//Bg29wvn3vfMjAN3iNw4rb7Zbb7fZY53Q65XQ6PdadPXtWO3bsUFJSUsm6gIAA9e/fXykpKaUeOyUlRYmJiR7rBgwYoFWrVnmn+FIwZgcAGMGbY3aXy6WQkBCPxeVyXfCcP/zwgwoKChQeHu6xPjw8XBkZGaXWmZGRUaHtvaFadeZbDp2yu4QaIbZNI0mMIH2JSxu+df58t5i45iJbwhuOzhvkmyfy4qAlKSnpgu75t125SapVmAMA4AuljdRLExoaqlq1aikzM9NjfWZmpiIiIkrdJyIiokLbewNjdgCAERxe/F951a1bV926dVNycnLJusLCQiUnJysmJqbUfWJiYjy2l6T169dbbu8NdOYAACPY9a1piYmJGjFihLp3766ePXtq3rx5ys3N1X333SdJSkhI0OWXX15yzX3ChAnq06eP5syZo4EDB2rZsmXavn27Fi5cWGU1EuYAAJRh2LBhOnHihGbMmKGMjAx16dJFa9euLbnJLS0tTQEBvwy6Y2NjtXTpUk2bNk2PPfaY2rRpo1WrVik6OrrKaqxW7zPnBjjf4AY43+MGON/iBjjfOjpvkE/eZ77tSLbXjtWjZYjXjlUd0JkDAMzAxwZY4gY4AAAMR2cOADACX4FqjTAHABjBrrvZTUCYAwCMQJZb45o5AACGozMHAJiB1twSYQ4AMAI3wFljzA4AgOHozAEARuBudmuEOQDACGS5NcbsAAAYjs4cAGAGWnNLhDkAwAjczW6NMTsAAIajMwcAGIG72a0R5gAAI5Dl1ghzAIAZSHNLXDMHAMBwdOYAACNwN7s1whwAYARugLPGmB0AAMPRmQMAjEBjbo0wBwCYgTS3xJgdAADD0ZkDAIzA3ezWCHMAgBG4m90aY3YAAAxHZw4AMAKNuTXCHABgBtLcEmEOADACN8BZ45o5AACGozMHABiBu9mtEeYAACOQ5dYI80r6ZM0KffSPvyv71I+6MqqN7hkzWS3bdrC7LL/2yfp1WvHOMu3fu1fZ2Vla/u4qtWvf3u6y/Bbn23ce6NdKAzpFqFVYfeXlF2jn0VP66/sHdORErt2lwRBcM6+ErZvXa9mi5xX/h5F64oU3dEVUaz07fYJOZ520uzS/dubMz+ra9RpNTHzY7lJqBM637/Rq1VhvffYf3fH850pYsFW1awXozTE9FVS3lt2lVS8OLy5V5OTJk7r77rsVHByshg0bauTIkcrJySlzn7i4ODkcDo9lzJgxFXpeOvNK+Hjl/6rPf92u628aLEkaMW6qvty+RZvXva9Bvx9hc3X+a/Bt8ZKkY8e+s7eQGoLz7Tv3Ltzm8fiRpV9qx1M3qWPzEH1xhCbhPBPuZr/77ruVnp6u9evXKz8/X/fdd59Gjx6tpUuXlrnfqFGjNGvWrJLHl112WYWet9xhnpiYWO6Dzp07t0JFmORcfr6Ofn1AA38V2gEBAerQpYcOH9htY2UA/EWDoOJ/mrN+PmtzJaiI/fv3a+3atdq2bZu6d+8uSXrxxRd166236tlnn1WzZs0s973ssssUERFR6ecud5jv2rXL4/HOnTt17tw5tW3bVpL01VdfqVatWurWrdtFj+V2u+V2uytYavXw0+ksFRYWKKRhY4/1wQ0bK/3b/9hUFQB/4XBI0+Ov1rYjJ/VVRtnj2ZrGm3ezl5ZDTqdTTqez0sdMSUlRw4YNS4Jckvr376+AgABt3bpVQ4YMsdz373//u95++21FRERo8ODBmj59eoW683JfM//0009LlsGDB6tPnz767rvvtHPnTu3cuVPffvut+vbtq4EDB170WC6XSyEhIR4L8GsfrHlPvbt3LVl27thud0l+jfNdfcy6M1ptIxvooTd3XXzjGsabl8xLyyGXy3VJ9WVkZCgsLMxjXe3atdW4cWNlZGRY7veHP/xBb7/9tj799FMlJSXprbfe0j333FOh567UNfM5c+Zo3bp1atSoUcm6Ro0a6amnntLNN9+syZMnl7l/UlLSBWN7UwK9QXBDBQTUUvZvbnY7nXVSIY0aW+yFiorre6M6duxc8jgsPNzGavwf57t6eOKODrrx6jANeylFGdl5dpfj10rLIauufOrUqfrrX/9a5vH2799f6VpGjx5d8v87duyoyMhI9evXT4cPH1arVq3KdYxKhfnp06d14sSJC9afOHFCP/3000X3v9RRhp1q16mjFq3baV/qNnWL6SNJKiws1L7Ubeo3aKjN1fmPevXqq169+naXUWNwvu33xB0ddHPHCA2fn6LvTp6xu5zqyYtj9ork0OTJk3XvvfeWuU3Lli0VERGh48ePe6w/d+6cTp48WaHr4b169ZIkff3111Ub5kOGDNF9992nOXPmqGfPnpKkrVu36pFHHtEdd9xRmUMaZcCQ4Vo0d5ai2rRXy99drXWrl8mdl6frbxpkd2l+LTsrS+np6Tpxovgvy9Gj30iSQkNDFdq0qZ2l+SXOt+/MujNat3drptGvbVeOu0ChDYpD5qe8fLnzC22urvqw6272pk2bqmk5XvMxMTHKysrSjh07Su4f27BhgwoLC0sCujxSU1MlSZGRkeXex1FUVFRU7q3/z88//6yHH35Yr7/+uvLz8yUVXxcYOXKkZs+erXr16lX0kHI4HNpy6FSF97PLJ++v0Ef/eLv4Q2Na/k53/ylRrdpF211WucS2Kb48cia/wn/0tlq98p+aMS3pgvVjHhynB8aOt6Gi8guqU/yPkEnn3B/Od4uJa2yupHy+ea70e40eXvql/rGt+r818Oi8QapElFRY2knv3Th9ZeOqmQ7fcsstyszM1IIFC0remta9e/eSt6YdO3ZM/fr105tvvqmePXvq8OHDWrp0qW699VY1adJE//73vzVp0iQ1b95cmzZtKvfzVirMz8vNzdXhw4clSa1atapUiJcUYliYm8zUMDeZiWFuMtPC3HSE+S9OnjypcePG6f3331dAQIDuvPNOvfDCC6pfv/gy1tGjRxUVFaVPP/1UcXFx+vbbb3XPPfdoz549ys3N1RVXXKEhQ4Zo2rRpCg4OLvfzXlKYexNh7juEue8R5r5FmPuWr8L8Wy+G+RVVFOZ24RPgAABG4FvTrPHZ7AAAGI7OHABgCFpzK4Q5AMAIjNmtMWYHAMBwdOYAACPQmFsjzAEARmDMbo0xOwAAhqMzBwAYwa7PZjcBYQ4AMANZbokwBwAYgSy3xjVzAAAMR2cOADACd7NbI8wBAEbgBjhrjNkBADAcnTkAwAw05pYIcwCAEchya4zZAQAwHJ05AMAI3M1ujTAHABiBu9mtMWYHAMBwdOYAACMwZrdGZw4AgOHozAEARqAzt0ZnDgCA4ejMAQBG4G52a4Q5AMAIjNmtMWYHAMBwdOYAACPQmFsjzAEAZiDNLTFmBwDAcHTmAAAjcDe7NcIcAGAE7ma3xpgdAADD0ZkDAIxAY26NMAcAmIE0t8SYHQBgBIcX/1dVnn76acXGxuqyyy5Tw4YNy7VPUVGRZsyYocjISAUFBal///46dOhQhZ6XMAcAwEvOnj2roUOH6oEHHij3Ps8884xeeOEFLViwQFu3blW9evU0YMAA5eXllfsYjqKioqLKFOxtDm5TBABj+SJK8s5571iOArfcbrfHOqfTKafT6ZXjL1myRBMnTlRWVlaZ2xUVFalZs2aaPHmyHn74YUlSdna2wsPDtWTJEt11113ler5q05kXFRUZt+Tl5WnmzJnKy8uzvZaasHC+Oef+vph8vn0hsLb3FpfLpZCQEI/F5XL55Of4tW+++UYZGRnq379/ybqQkBD16tVLKSkp5T5OtenMTXT69GmFhIQoOztbwcHBdpfj9zjfvsc59y3Ot++43dWjM9+yZYuuvfZaff/994qMjCxZ//vf/14Oh0PLly8v1/NVm84cAABfcTqdCg4O9lisgnzq1KlyOBxlLgcOHPDxT+CJt6YBAFCGyZMn69577y1zm5YtW1bq2BEREZKkzMxMj848MzNTXbp0KfdxCHMAAMrQtGlTNW3atEqOHRUVpYiICCUnJ5eE9+nTp7V169YK3RHPmP0SOJ1OzZw502vXWFA2zrfvcc59i/NtvrS0NKWmpiotLU0FBQVKTU1VamqqcnJySrZp166dVq5cKan4nVwTJ07UU089pffee0+7d+9WQkKCmjVrpvj4+HI/LzfAAQDgJffee6/eeOONC9Z/+umniouLk1Qc4H/7299KRvdFRUWaOXOmFi5cqKysLF133XV6+eWX9bvf/a7cz0uYAwBgOMbsAAAYjjAHAMBwhDkAAIYjzFHtxcXFaeLEiXaXAfgUr3tUBGEOAIDhCHMAAAxHmFfC2rVrdd1116lhw4Zq0qSJBg0apMOHD9tdll87d+6cxo0bp5CQEIWGhmr69Ok++6ammqqwsFDPPPOMWrduLafTqSuvvFJPP/203WX5pdzcXCUkJKh+/fqKjIzUnDlz7C4JhiHMKyE3N1eJiYnavn27kpOTFRAQoCFDhqiwsNDu0vzWG2+8odq1a+uLL77Q888/r7lz52rx4sV2l+XXkpKS9Je//EXTp0/Xvn37tHTpUoWHh9tdll965JFHtGnTJq1evVrr1q3Txo0btXPnTrvLgkH40Bgv+OGHH9S0aVPt3r1b0dHRdpfjd+Li4nT8+HHt3btXDodDUvG3GL333nvat2+fzdX5p59++klNmzbVSy+9pPvvv9/ucvxaTk6OmjRporfffltDhw6VJJ08eVLNmzfX6NGjNW/ePHsLhBHozCvh0KFDGj58uFq2bKng4GC1aNFCUvFn8qJq9O7duyTIJSkmJkaHDh1SQUGBjVX5r/3798vtdqtfv352l+L3Dh8+rLNnz6pXr14l6xo3bqy2bdvaWBVMw7emVcLgwYN11VVXadGiRWrWrJkKCwsVHR2ts2fP2l0a4BVBQUF2lwCgAujMK+jHH3/UwYMHNW3aNPXr10/t27fXqVOn7C7L723dutXj8b/+9S+1adNGtWrVsqki/9amTRsFBQUpOTnZ7lL8XqtWrVSnTh2P1/ipU6f01Vdf2VgVTENnXkGNGjVSkyZNtHDhQkVGRiotLU1Tp061uyy/l5aWpsTERP3pT3/Szp079eKLL3LHbxUKDAzUlClT9Oijj6pu3bq69tprdeLECe3du1cjR460uzy/Ur9+fY0cOVKPPPKImjRporCwMP3P//yPAgLotVB+hHkFBQQEaNmyZXrooYcUHR2ttm3b6oUXXij5ajtUjYSEBJ05c0Y9e/ZUrVq1NGHCBI0ePdrusvza9OnTVbt2bc2YMUPff/+9IiMjNWbMGLvL8kuzZ89WTk6OBg8erAYNGmjy5MnKzs62uywYhLvZAQAwHHMcAAAMR5gDAGA4whwAAMMR5gAAGI4wBwDAcIQ5AACGI8wBADAcYQ4AgOEIcwAADEeYAwBgOMIcAADD/X9dYG2qQxfPQQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.heatmap(L, cmap = 'Blues', \n",
    "            annot = True, fmt = '.0f',\n",
    "            xticklabels = list(G.nodes), \n",
    "            yticklabels = list(G.nodes),\n",
    "            linecolor = 'k', square = True,\n",
    "            linewidths = 0.2)\n",
    "plt.savefig('拉普拉斯矩阵.svg')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0cfbe37e-531f-4199-80a9-cdd225f78119",
   "metadata": {},
   "source": [
    "## 验证拉普拉斯矩阵"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "c2821e08-e748-41bd-9288-d73c02c145b1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0, 1, 1, 0],\n",
       "       [1, 0, 1, 1],\n",
       "       [1, 1, 0, 1],\n",
       "       [0, 1, 1, 0]], dtype=int32)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A = nx.adjacency_matrix(G).todense()\n",
    "A"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "fccbafd1-66d6-48ac-ba4a-16ae7984afd2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([2, 3, 3, 2], dtype=int32)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "D = A.sum(axis = 0)\n",
    "D"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "07a8a484-5d16-4c1c-b2d7-6955bc9dff45",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[2, 0, 0, 0],\n",
       "       [0, 3, 0, 0],\n",
       "       [0, 0, 3, 0],\n",
       "       [0, 0, 0, 2]], dtype=int32)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "D = np.diag(D)\n",
    "D"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "38462470-87c2-4c7d-98e4-16d70c86503b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 2, -1, -1,  0],\n",
       "       [-1,  3, -1, -1],\n",
       "       [-1, -1,  3, -1],\n",
       "       [ 0, -1, -1,  2]], dtype=int32)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "D - A"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dc0b23bc-d8fb-4534-9e35-3160487bf434",
   "metadata": {},
   "source": [
    "## 归一化 (对称) 拉普拉斯矩阵"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "42a80f3d-4f54-44c0-a381-6fa54bac8ee4",
   "metadata": {},
   "source": [
    "$$L_N = D^{-1/2} L D^{-1/2}$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "f95f9eff-3a67-4e3c-baa4-0f933149843c",
   "metadata": {},
   "outputs": [],
   "source": [
    "L_N = nx.normalized_laplacian_matrix(G).todense()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "312f9817-430c-4090-b874-c8e727791a51",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.        , -0.40824829, -0.40824829,  0.        ],\n",
       "       [-0.40824829,  1.        , -0.33333333, -0.40824829],\n",
       "       [-0.40824829, -0.33333333,  1.        , -0.40824829],\n",
       "       [ 0.        , -0.40824829, -0.40824829,  1.        ]])"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "L_N"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "efabd6b3-69fc-4ade-8993-df18bf7ba862",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.heatmap(L_N, cmap = 'Blues', \n",
    "            annot = True, fmt = '.3f',\n",
    "            xticklabels = list(G.nodes), \n",
    "            yticklabels = list(G.nodes),\n",
    "            linecolor = 'k', square = True,\n",
    "            linewidths = 0.2)\n",
    "plt.savefig('归一化拉普拉斯矩阵.svg')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "55bbf154-bf7e-4f87-8985-b44ae7bf4072",
   "metadata": {},
   "source": [
    "## 验证归一化拉普拉斯矩阵"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "256533ed-a8db-4532-90d8-c3e386d35c4c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.70710678, 0.        , 0.        , 0.        ],\n",
       "       [0.        , 0.57735027, 0.        , 0.        ],\n",
       "       [0.        , 0.        , 0.57735027, 0.        ],\n",
       "       [0.        , 0.        , 0.        , 0.70710678]])"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "D_sqrt_inv = np.diag(1/np.sqrt(A.sum(axis = 0)))\n",
    "D_sqrt_inv"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "82492f5b-8976-4984-90e8-401210b698af",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.        , -0.40824829, -0.40824829,  0.        ],\n",
       "       [-0.40824829,  1.        , -0.33333333, -0.40824829],\n",
       "       [-0.40824829, -0.33333333,  1.        , -0.40824829],\n",
       "       [ 0.        , -0.40824829, -0.40824829,  1.        ]])"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "D_sqrt_inv @ L @ D_sqrt_inv"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c4b03288-e105-4939-9989-3141141d6e50",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4e7bb359-c539-4101-ac17-aa65f7a89119",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
